This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.
# packages required
# install.packages("gridExtra")
#packages = c("gtrendsR","tidyverse","usmap")
#install.packages("mapproj")
# importing libraries
library(dplyr)
library(tidyverse)
library(data.table)
library(ggplot2)
library(scales)
library(gridExtra)
# read in NYtimes Covid data tables
# Cumulative Daily Cases and Deaths by
# 1 - County Level
cty_data <-read.csv("us-counties.csv")
# 2 - State Level
state_data <-read.csv("us-states.csv")
state_pop <-read.csv("state_pop.csv")
# 3 -
us_data <-read.csv("us.csv")
# transforming date column from CHARACTER to DATE class
cty_data$date <- as.Date(cty_data$date)
state_data$date <- as.Date(state_data$date,format="%Y-%m-%d")
us_data$date <- as.Date(us_data$date)
# filter out dates before March 1st, 2020
cty_data <- base::subset(cty_data,date>"2020-02-29")
state_data <- base::subset(state_data,date>"2020-02-29")
us_data <- base::subset(us_data,date>"2020-02-29")
# Examination of US-wide Temporal Trends
# Use `filter()` to add a column named `new_cases` and 'new_deaths'
us_data$new_cases = as.numeric(stats::filter(us_data$cases,filter=c(1,-1), sides=1))
us_data$new_deaths = as.numeric(stats::filter(us_data$deaths,filter=c(1,-1), sides=1))
# Change first entry fo new deaths and new cases from NA to 0
us_data$new_cases[1]<-0
us_data$new_deaths[1]<-0
# Add Data on Season
season <- c("Spring","Summer","Winter","Fall")
# create df for seasons
season_df = data.frame(c(1:12),c("Winter","Winter","Spring","Spring","Spring","Summer","Summer","Summer","Fall","Fall","Fall","Winter"))
names(season_df)[1] <- "month"
names(season_df)[2] <- "season"
for (i in 1:length(us_data$date))
{
if (month(us_data$date[i]) >= 3 & month(us_data$date[i]) < 6) {
us_data$season[i] = season[1]
} else if (month(us_data$date[i]) >= 6 & month(us_data$date[i]) < 9) {
us_data$season[i] = season[2]
} else if (month(us_data$date[i]) >= 9 & month(us_data$date[i]) < 12) {
us_data$season[i] = season[3]
} else {
us_data$season[i] = season[4]
}
}
us_data$season = as.factor(us_data$season)
## Plotting Below
# Timeseries of Covid Cases and Deaths through time
# Value used to transform the data
p1 <- ggplot(us_data, aes(x = date, y = new_cases)) +
geom_line(color = "darkred") +
labs(title="US Covid-19 Cases and Deaths", y="Daily New Cases", x="")
p2 <- ggplot(us_data, aes(x = date, y = new_deaths)) +
geom_line(color = "black") +
labs( y="Daily New Deaths", x="Date")
grid.arrange(p1,p2,nrow=2)

# scatter plot comparison of Cases Vs Deaths
gg <- ggplot(us_data,aes(x = new_cases, y = new_deaths, colour = season)) +
geom_point() +
labs(title="Cases Vs Deaths",subtitle="US Country-wide Covid Counts",y="Daily Deaths", x="Daily Cases")
plot(gg)








regions <- state.region
demographics <- state.x77
demographics = data.frame(demographics)
states_info <- data.frame("Name" = states_vect,"Region" = regions,"Pop"=demographics$Population)
options
function (...)
.Internal(options(...))
<bytecode: 0x7ff0e39b9a78>
<environment: namespace:base>
#par(mfrow=c(2,1))
for (val in states_vect)
{
# subset by state
dum <- subset(state_data3, state == val)
if (val == "Alabama"){
plot(dum$date,dum$pc_new_cases,"l", xlab="Date", ylab="Dly Per Capita Cases",ylim=c(0,0.25e-2),cex=3/4)
par(new = TRUE)
plot(dum$date,dum$pc_new_deaths,"l", xlab="", ylab="",axes = FALSE,col=rgb(red = 1, green = 0, blue = 0, alpha = 0.5),ylim=c(0,0.1e-3))
axis(side=4, col.axis = "dark red",col.ticks = "dark red", ylim=c(0,0.1e-3))
mtext("Daily \n Per Capita Deaths",side=4,line=3, col = "dark red",cex=2/3)
title(val)
}else{
plot(dum$date,dum$pc_new_cases,"l", xlab="", ylab="",ylim=c(0,0.25e-2))
par(new = TRUE)
plot(dum$date,dum$pc_new_deaths,"l", xlab="", ylab="",axes = FALSE,col=rgb(red = 1, green = 0, blue = 0, alpha = 0.5), ylim=c(0,0.1e-3))
axis(side=4, col.axis = "dark red",col.ticks = "dark red")
title(val)}
}


















































Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tCnRpdGxlOiAiU1RBIDIyMCAtIEZpbmFsIFByb2plY3QgRGF0YSBBbmFsYXlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIAoKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIAoKYGBge3J9CiMgcGFja2FnZXMgcmVxdWlyZWQKIyBpbnN0YWxsLnBhY2thZ2VzKCJncmlkRXh0cmEiKQojcGFja2FnZXMgPSBjKCJndHJlbmRzUiIsInRpZHl2ZXJzZSIsInVzbWFwIikKI2luc3RhbGwucGFja2FnZXMoIm1hcHByb2oiKQojIGltcG9ydGluZyBsaWJyYXJpZXMKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShnZ3Bsb3QyKSAgCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdyaWRFeHRyYSkKCmBgYAoKYGBge3J9CiMgcmVhZCBpbiBOWXRpbWVzIENvdmlkIGRhdGEgdGFibGVzIAoKIyBDdW11bGF0aXZlIERhaWx5IENhc2VzIGFuZCBEZWF0aHMgYnkgCiMgMSAtIENvdW50eSBMZXZlbApjdHlfZGF0YSA8LXJlYWQuY3N2KCJ1cy1jb3VudGllcy5jc3YiKSAKCiMgMiAtIFN0YXRlIExldmVsCnN0YXRlX2RhdGEgPC1yZWFkLmNzdigidXMtc3RhdGVzLmNzdiIpCnN0YXRlX3BvcCA8LXJlYWQuY3N2KCJzdGF0ZV9wb3AuY3N2IikKCiMgMyAtIAp1c19kYXRhIDwtcmVhZC5jc3YoInVzLmNzdiIpCmBgYAoKYGBge3J9CiMgdHJhbnNmb3JtaW5nIGRhdGUgY29sdW1uIGZyb20gQ0hBUkFDVEVSIHRvIERBVEUgY2xhc3MKY3R5X2RhdGEkZGF0ZSA8LSBhcy5EYXRlKGN0eV9kYXRhJGRhdGUpCnN0YXRlX2RhdGEkZGF0ZSA8LSBhcy5EYXRlKHN0YXRlX2RhdGEkZGF0ZSxmb3JtYXQ9IiVZLSVtLSVkIikKdXNfZGF0YSRkYXRlIDwtIGFzLkRhdGUodXNfZGF0YSRkYXRlKQpgYGAKCmBgYHtyfQojIGZpbHRlciBvdXQgZGF0ZXMgYmVmb3JlIE1hcmNoIDFzdCwgMjAyMApjdHlfZGF0YSA8LSBiYXNlOjpzdWJzZXQoY3R5X2RhdGEsZGF0ZT4iMjAyMC0wMi0yOSIpCnN0YXRlX2RhdGEgPC0gYmFzZTo6c3Vic2V0KHN0YXRlX2RhdGEsZGF0ZT4iMjAyMC0wMi0yOSIpCnVzX2RhdGEgPC0gYmFzZTo6c3Vic2V0KHVzX2RhdGEsZGF0ZT4iMjAyMC0wMi0yOSIpCmBgYAoKYGBge3J9CiMgRXhhbWluYXRpb24gb2YgVVMtd2lkZSBUZW1wb3JhbCBUcmVuZHMKCiMgVXNlIGBmaWx0ZXIoKWAgdG8gYWRkIGEgY29sdW1uIG5hbWVkIGBuZXdfY2FzZXNgIGFuZCAnbmV3X2RlYXRocycKdXNfZGF0YSRuZXdfY2FzZXMgPSBhcy5udW1lcmljKHN0YXRzOjpmaWx0ZXIodXNfZGF0YSRjYXNlcyxmaWx0ZXI9YygxLC0xKSwgc2lkZXM9MSkpCgp1c19kYXRhJG5ld19kZWF0aHMgPSBhcy5udW1lcmljKHN0YXRzOjpmaWx0ZXIodXNfZGF0YSRkZWF0aHMsZmlsdGVyPWMoMSwtMSksIHNpZGVzPTEpKQogCiMgQ2hhbmdlIGZpcnN0IGVudHJ5IGZvIG5ldyBkZWF0aHMgYW5kIG5ldyBjYXNlcyBmcm9tIE5BIHRvIDAKdXNfZGF0YSRuZXdfY2FzZXNbMV08LTAKdXNfZGF0YSRuZXdfZGVhdGhzWzFdPC0wCgojIEFkZCBEYXRhIG9uIFNlYXNvbgpzZWFzb24gPC0gYygiU3ByaW5nIiwiU3VtbWVyIiwiV2ludGVyIiwiRmFsbCIpCgojIGNyZWF0ZSBkZiBmb3Igc2Vhc29ucwpzZWFzb25fZGYgPSBkYXRhLmZyYW1lKGMoMToxMiksYygiV2ludGVyIiwiV2ludGVyIiwiU3ByaW5nIiwiU3ByaW5nIiwiU3ByaW5nIiwiU3VtbWVyIiwiU3VtbWVyIiwiU3VtbWVyIiwiRmFsbCIsIkZhbGwiLCJGYWxsIiwiV2ludGVyIikpCm5hbWVzKHNlYXNvbl9kZilbMV0gPC0gIm1vbnRoIgpuYW1lcyhzZWFzb25fZGYpWzJdIDwtICJzZWFzb24iCgpmb3IgKGkgaW4gMTpsZW5ndGgodXNfZGF0YSRkYXRlKSkKewogIGlmIChtb250aCh1c19kYXRhJGRhdGVbaV0pID49IDMgJiBtb250aCh1c19kYXRhJGRhdGVbaV0pIDwgNikgewogICAgdXNfZGF0YSRzZWFzb25baV0gPSBzZWFzb25bMV0KICB9IGVsc2UgaWYgKG1vbnRoKHVzX2RhdGEkZGF0ZVtpXSkgPj0gNiAmIG1vbnRoKHVzX2RhdGEkZGF0ZVtpXSkgPCA5KSB7CiAgICB1c19kYXRhJHNlYXNvbltpXSA9IHNlYXNvblsyXQogIH0gZWxzZSBpZiAobW9udGgodXNfZGF0YSRkYXRlW2ldKSA+PSA5ICYgbW9udGgodXNfZGF0YSRkYXRlW2ldKSA8IDEyKSB7CiAgICB1c19kYXRhJHNlYXNvbltpXSA9IHNlYXNvblszXQogIH0gZWxzZSB7CiAgICB1c19kYXRhJHNlYXNvbltpXSA9IHNlYXNvbls0XQogIH0KfQp1c19kYXRhJHNlYXNvbiA9IGFzLmZhY3Rvcih1c19kYXRhJHNlYXNvbikKCiMjIFBsb3R0aW5nIEJlbG93CgojIFRpbWVzZXJpZXMgb2YgQ292aWQgQ2FzZXMgYW5kIERlYXRocyB0aHJvdWdoIHRpbWUKIyBWYWx1ZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgZGF0YQpwMSA8LSBnZ3Bsb3QodXNfZGF0YSwgYWVzKHggPSBkYXRlLCB5ID0gbmV3X2Nhc2VzKSkgKwogICAgICAgICAgICBnZW9tX2xpbmUoY29sb3IgPSAiZGFya3JlZCIpICsKICBsYWJzKHRpdGxlPSJVUyBDb3ZpZC0xOSBDYXNlcyBhbmQgRGVhdGhzIiwgIHk9IkRhaWx5IE5ldyBDYXNlcyIsIHg9IiIpCiAgCgpwMiA8LSBnZ3Bsb3QodXNfZGF0YSwgYWVzKHggPSBkYXRlLCB5ID0gbmV3X2RlYXRocykpICsKICAgICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImJsYWNrIikgKwogIGxhYnMoICB5PSJEYWlseSBOZXcgRGVhdGhzIiwgeD0iRGF0ZSIpCiAgCmdyaWQuYXJyYW5nZShwMSxwMixucm93PTIpCgojIHNjYXR0ZXIgcGxvdCBjb21wYXJpc29uIG9mIENhc2VzIFZzIERlYXRocwpnZyA8LSBnZ3Bsb3QodXNfZGF0YSxhZXMoeCA9IG5ld19jYXNlcywgeSA9IG5ld19kZWF0aHMsIGNvbG91ciA9IHNlYXNvbikpICsKICBnZW9tX3BvaW50KCkgKwogICBsYWJzKHRpdGxlPSJDYXNlcyBWcyBEZWF0aHMiLHN1YnRpdGxlPSJVUyBDb3VudHJ5LXdpZGUgQ292aWQgQ291bnRzIix5PSJEYWlseSBEZWF0aHMiLCB4PSJEYWlseSBDYXNlcyIpCgpwbG90KGdnKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CiMjIEV4YW1pbmluZyBTdGF0ZSBTcGF0aWFsIFRyZW5kcwoKIyAxIC0gRm9ybWF0dGluZyBEYXRhCgojIHJlbW92ZSBsZWFkaW5nIGNoYXJhY3RlciBpbiBTdGF0ZV9Qb3AkU3RhdGUKc3RhdGVfcG9wJFN0YXRlIDwtIHN1YnN0cmluZyhzdGF0ZV9wb3AkU3RhdGUsMikKCiMgcmVtb3ZlIGNvbW1hcyBmcm9tIHBvcHVsYXRpb24gYW5kIGNvbnZlcnQgdG8gbnVtZXJpYwpzdGF0ZV9wb3AkUG9wdWxhdGlvbiA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCIiLHN0YXRlX3BvcCRQb3B1bGF0aW9uKSkKCgojIGFkZCBzdGF0ZSBwb3B1bGF0aW9uIGRhdGEKc3RhdGVfZGF0YSA8LSBtZXJnZShzdGF0ZV9kYXRhLCBzdGF0ZV9wb3AsIGJ5Lng9InN0YXRlIiwgYnkueT0iU3RhdGUiKQoKCiMgZ2V0IHBvcHVsYXRpb24gZGVuc2l0eQojIHJlbW92ZSBEQyBmcm9tIHN0YXRlX3BvcCBsaXN0CnN0YXRlX3BvcCA8LXN0YXRlX3BvcCBbLWMoOSksIF0gCnN0YXRlLmRlbnNpdHkgPSBzdGF0ZV9wb3AkUG9wdWxhdGlvbi9zdGF0ZS5hcmVhCgojIyBnZXQgc3RhdGUgcmVnaW9uYWwgZGF0YQpzdGF0ZXNfaW5mbyA8LSBkYXRhLmZyYW1lKHN0YXRlLm5hbWUsc3RhdGUucmVnaW9uLHN0YXRlLmRlbnNpdHkpCm5hbWVzKHN0YXRlc19pbmZvKVsxXSA8LSAiTmFtZSIKbmFtZXMoc3RhdGVzX2luZm8pWzJdIDwtICJSZWdpb24iCm5hbWVzKHN0YXRlc19pbmZvKVszXSA8LSAiRGVuc2l0eSIKCiMgYWRkIHN0YXRlIHJlZ2lvbiBkYXRhCnN0YXRlX2RhdGEgPC0gbWVyZ2Uoc3RhdGVfZGF0YSwgc3RhdGVzX2luZm8sIGJ5Lng9InN0YXRlIiwgYnkueT0iTmFtZSIpCgojIGNhdGVnb3JpemUgaW50byBkZW5zaXR5IGdyb3VwcwoKZm9yIChpIGluIDE6bGVuZ3RoKHN0YXRlX2RhdGEkRGVuc2l0eSkpCnsKICBpZiAoc3RhdGVfZGF0YSREZW5zaXR5W2ldIDw9IDUwKSB7CiAgICAgc3RhdGVfZGF0YSREZW5zaXR5MltpXSA8LSAiPD01MCIKICB9IGVsc2UgaWYgKHN0YXRlX2RhdGEkRGVuc2l0eVtpXSA+ICA1MCAmIHN0YXRlX2RhdGEkRGVuc2l0eVtpXSA8PSAxMDApIHsKICAgIHN0YXRlX2RhdGEkRGVuc2l0eTJbaV0gPC0gIjUwLTEwMCIKICB9IGVsc2UgaWYgKHN0YXRlX2RhdGEkRGVuc2l0eVtpXSA+ICAxMDAgJiBzdGF0ZV9kYXRhJERlbnNpdHlbaV0gPD0gNDAwKSB7CiAgICBzdGF0ZV9kYXRhJERlbnNpdHkyW2ldIDwtICIxMDAtNDAwIgogIH0gZWxzZSB7CiAgICBzdGF0ZV9kYXRhJERlbnNpdHkyW2ldIDwtICI+NDAwIgogIH0KfQpzdGF0ZV9kYXRhJERlbnNpdHkyIDwtIGZhY3RvcihzdGF0ZV9kYXRhJERlbnNpdHkyLAogICAgbGV2ZWxzID0gYygnPD01MCcsJzUwLTEwMCcsJzEwMC00MDAnLCc+NDAwJyksb3JkZXJlZCA9IFRSVUUpCgojIHNvcnQgYnkgZGF0ZQpzdGF0ZV9kYXRhPC1zdGF0ZV9kYXRhW29yZGVyKChzdGF0ZV9kYXRhJGRhdGUpKSxdCgojIEZpbmQgdW5pcXVlIGZpcHMgdmFsdWVzIHRvIGZpbmQgdW5pcXVlIGNvdW50aWVzCmZpcHNfdmVjdCA8LSB1bmlxdWUoY3R5X2RhdGEkZmlwcykKCiMgRmluZCB1bmlxdWUgZGF0ZXMKZGF0ZXNfdmVjdCA8LSB1bmlxdWUoY3R5X2RhdGEkZGF0ZSkKCiMgZmluZCB1bmlxdWUgc3RhdGVzIChFeGNsdWRlIHRlcnJpdG9yaWVzKQpzdGF0ZXNfdmVjdCA8LXN0YXRlLm5hbWU7CgojIEZpbmQgbnVtYmVyIG9mIGRhaWx5IG5ldyBjYXNlcyBhbmQgZGVhdGhzIGJ5IHN0YXRlCmkgPC0xCgojIGxvb3BpbmcgdGhyb3VnaCB1bmlxdWUgc3RhdGUgbmFtZXMKZm9yICh2YWwgaW4gc3RhdGVzX3ZlY3QpCnsKICAjIHN1YnNldCBieSBzdGF0ZQogIGR1bSA8LSBzdWJzZXQoc3RhdGVfZGF0YSwgc3RhdGUgPT0gdmFsKQogIAogICNVc2UgYGZpbHRlcigpYCB0byBhZGQgYSBjb2x1bW4gbmFtZWQgYG5ld19jYXNlc2AgCiAgZHVtJG5ld19jYXNlcyA9IGFzLm51bWVyaWMoc3RhdHM6OmZpbHRlcihkdW0kY2FzZXMsZmlsdGVyPWMoMSwtMSksIHNpZGVzPTEpKQoKICAjIFNldCBOYSB2YWx1ZXMgdG8gMC4gVGhlc2Ugb2NjdXIgb24gdGhlIGZpcnN0IGRhdGUgb2Ygb2JlcnZhdGlvbnMKICBkdW0kbmV3X2Nhc2VzW2lzLm5hKGR1bSRuZXdfY2FzZXMpXSA8LSAwCiAgCiAgI1VzZSBgZmlsdGVyKClgIHRvIGFkZCBhIGNvbHVtbiBuYW1lZCBgbmV3X2RlYXRoc2AgCiAgZHVtJG5ld19kZWF0aHMgPSBhcy5udW1lcmljKHN0YXRzOjpmaWx0ZXIoZHVtJGRlYXRocyxmaWx0ZXI9YygxLC0xKSwgc2lkZXM9MSkpCiAgCiAgICAjIFNldCBOYU4gdmFsdWVzIHRvIDAuIFRoZXNlIG9jY3VyIG9uIHRoZSBmaXJzdCBkYXRlIG9mIG9iZXJ2YXRpb25zCiAgZHVtJG5ld19kZWF0aHNbaXMubmEoZHVtJG5ld19kZWF0aHMpXSA8LSAwCiAgCiAgIyBhcHBlbmQgdG8gZGF0YWZyYW1lCiAgaWYgKGk+MSl7CiAgICBkZjEgPC0gcmJpbmQoZGYxLGR1bSkKICB9ZWxzZXsKICAgIGRmMSA8LSBkdW0KICB9CiAgaSA8LSBpKzEKICBybShkdW0pCn0KIyBmaW5hbCBuZXcgZGF0YSBmcmFtZQpzdGF0ZV9kYXRhMiA8LSBkZjEKCiNjYWxjdWxhdGUgcGVyIGNhcGl0YSBjYXNlIGFuZCBkZWF0aCByYXRlcwpzdGF0ZV9kYXRhMiRwY19uZXdfY2FzZXMgPC0gc3RhdGVfZGF0YTIkbmV3X2Nhc2VzIC8gc3RhdGVfZGF0YTIkUG9wdWxhdGlvbgpzdGF0ZV9kYXRhMiRwY19uZXdfZGVhdGhzIDwtIHN0YXRlX2RhdGEyJG5ld19kZWF0aHMgLyBzdGF0ZV9kYXRhMiRQb3B1bGF0aW9uCgojIGV4dHJhY3RpbmcgeWVhciBhbmQgbW9udGgKbW9udGggPC0gZGF0YS5mcmFtZShmb3JtYXQoc3RhdGVfZGF0YTIkZGF0ZSxmb3JtYXQ9IiVtLyV5IikpCiMgbW9udGggPC0gZGF0YS5mcmFtZShmb3JtYXQoc3RhdGVfZGF0YTIkZGF0ZSxmb3JtYXQ9IiVtIikpCgojIGFkZCBhcyBjb2x1bW5zIHRvIGRmCiMgc3RhdGVfZGF0YTI8LWJpbmRfY29scyhzdGF0ZV9kYXRhMix5ZWFyKQpzdGF0ZV9kYXRhMjwtYmluZF9jb2xzKHN0YXRlX2RhdGEyLG1vbnRoKQoKIyBzb3J0aW5nIGNvbHVtbnMKc3RhdGVfZGF0YTMgPC0gc3RhdGVfZGF0YTJbLGMoMSwxNCwyOjEzKV0KCiMgcmVuYW1pbmcgY29sdW1ucwpuYW1lcyhzdGF0ZV9kYXRhMylbMl0gPC0gIm1vbnRoIgoKIyBDYWxjdWxhdGUgcGMgYXZnIGNhc2VzIGZvciBlYWNoIHN0YXRlCnN0YXRlX21udGhseV9jYXNlcyA9IGFzLmRhdGEudGFibGUoc3RhdGVfZGF0YTMpWywgbWVhbihwY19uZXdfY2FzZXMpLCBieSA9IC4obW9udGgsc3RhdGUsIFJlZ2lvbixEZW5zaXR5MildCm5hbWVzKHN0YXRlX21udGhseV9jYXNlcylbNV0gPC0gImF2Z19wY19jYXNlcyIKc3RhdGVfbW50aGx5X2Nhc2VzJERlbnNpdHkyID0gYXMuZmFjdG9yKHN0YXRlX21udGhseV9jYXNlcyREZW5zaXR5MikKbmFtZXMoc3RhdGVfbW50aGx5X2Nhc2VzKVs0XSA8LSAiRGVuc2l0eSIKCiMgQ2FsY3VsYXRlIGF2ZyBkZWF0aHMgZm9yIGVhY2ggc3RhdGUKc3RhdGVfbW50aGx5X2RlYXRocyA9IGFzLmRhdGEudGFibGUoc3RhdGVfZGF0YTMpWywgbWVhbihwY19uZXdfZGVhdGhzKSwgYnkgPSAuKG1vbnRoLHN0YXRlLFJlZ2lvbixEZW5zaXR5MildCm5hbWVzKHN0YXRlX21udGhseV9kZWF0aHMpWzVdIDwtICJhdmdfcGNfZGVhdGhzIgpzdGF0ZV9tbnRobHlfZGVhdGhzJERlbnNpdHkyID0gYXMuZmFjdG9yKHN0YXRlX21udGhseV9kZWF0aHMkRGVuc2l0eTIpCm5hbWVzKHN0YXRlX21udGhseV9kZWF0aHMpWzRdIDwtICJEZW5zaXR5IgoKIyBCb3hwbG90IG9mIE1vbnRobHkgQ3VtdWxhdGl2ZSBDYXNlcyBieSBTdGF0ZQoKIyBnZXR0aW5nIGRhdGVzIGluIG9yZGVyCmR1bSA9IHVuaXF1ZShzdGF0ZV9tbnRobHlfY2FzZXMkbW9udGgpCnN0YXRlX21udGhseV9jYXNlcyRtb250aCA8LSBmYWN0b3Ioc3RhdGVfbW50aGx5X2Nhc2VzJG1vbnRoICwgbGV2ZWxzPWR1bSkKc3RhdGVfbW50aGx5X2RlYXRocyRtb250aCA8LSBmYWN0b3Ioc3RhdGVfbW50aGx5X2RlYXRocyRtb250aCAsIGxldmVscz1kdW0pCgojIHBsb3R0aW5nIGJlbG93CiMgTm8gY29sb3JpbmcKbW50aGx5X2Nhc2VfYnBsb3QgPSBnZ3Bsb3Qoc3RhdGVfbW50aGx5X2Nhc2VzLGFlcyhtb250aCwgYXZnX3BjX2Nhc2VzKSkgKyAKZ2VvbV9ib3hwbG90KCkgCm1udGhseV9jYXNlX2JwbG90ICsgbGFicyh5ID0gIk1lYW4gUGVyIENhcGl0YSBEYWlseSBDYXNlcyBieSBTdGF0ZSIseCA9ICJNb250aCIsCiAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJCb3ggUGxvdCBvZiBNb250aGx5IFBlciBDYXBpdGEgQ292aWQtMTkgQ2FzZXMgYnkgU3RhdGUiKSAKCm1udGhseV9kZWF0aF9icGxvdCA9IGdncGxvdChzdGF0ZV9tbnRobHlfZGVhdGhzLGFlcyhtb250aCwgYXZnX3BjX2RlYXRocykpICsgZ2VvbV9ib3hwbG90KCkgCm1udGhseV9kZWF0aF9icGxvdCArIGxhYnMoeSA9ICJNZWFuIFBlciBDYXBpdGEgRGFpbHkgRGVhdGhzIGJ5IFN0YXRlIix4ID0gIk1vbnRoIiwKICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkJveCBQbG90IG9mIE1vbnRobHkgQ2FwaXRhIENvdmlkLTE5IERlYXRocyBieSBTdGF0ZSIpICAKCiMgUmVnaW9uIE1hcAphbGxfc3RhdGVzIDwtIG1hcF9kYXRhKCJzdGF0ZSIpCmFsbF9zdGF0ZXMkcmVnaW9uIDwtIHN0cl90b190aXRsZShhbGxfc3RhdGVzJHJlZ2lvbikgIApzdGF0ZURhdGEgPC0gbWVyZ2UoYWxsX3N0YXRlcyxzdGF0ZXNfaW5mbyxieS54PSJyZWdpb24iLGJ5LnkgPSAiTmFtZSIgKQoKcmVnaW9ucGxvdCA8LSBnZ3Bsb3QoKStnZW9tX3BvbHlnb24oZGF0YT1zdGF0ZURhdGEsYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGw9UmVnaW9uKSxjb2xvcj0iZ3JleTUwIikrY29vcmRfbWFwKCkKcmVnaW9ucGxvdAoKIyBDb2xvciBieSByZWdpb24KbW50aGx5X2Nhc2VfYnBsb3QyID0gZ2dwbG90KHN0YXRlX21udGhseV9jYXNlcyxhZXMobW9udGgsIGF2Z19wY19jYXNlcykpICsgCmdlb21fYm94cGxvdChhZXMoY29sb3IgPSBSZWdpb24pKSAKbW50aGx5X2Nhc2VfYnBsb3QyICsgbGFicyh5ID0gIk1lYW4gUGVyIENhcGl0YSBEYWlseSBDYXNlcyBieSBSZWdpb24iLHggPSAiTW9udGgiLAogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiQm94IFBsb3Qgb2YgTW9udGhseSBQZXIgQ2FwaXRhIENvdmlkLTE5IENhc2VzIGJ5IFJlZ2lvbiIpICAKCm1udGhseV9kZWF0aF9icGxvdDIgPSBnZ3Bsb3Qoc3RhdGVfbW50aGx5X2RlYXRocyxhZXMobW9udGgsIGF2Z19wY19kZWF0aHMpKSArIApnZW9tX2JveHBsb3QoYWVzKGNvbG9yID0gUmVnaW9uKSkgCm1udGhseV9kZWF0aF9icGxvdDIgKyBsYWJzKHkgPSAiTWVhbiBEYWlseSBQZXIgQ2FwaXRhIERlYXRocyBieSBSZWdpb24iLHggPSAiTW9udGgiLAogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiQm94IFBsb3Qgb2YgTW9udGhseSBQZXIgQ2FwaXRhIENvdmlkLTE5IERlYXRocyBieSBSZWdpb24iKSAKIyBDb2xvciBieSBkZW5zaXR5Cm1udGhseV9jYXNlX2JwbG90MyA9IGdncGxvdChzdGF0ZV9tbnRobHlfY2FzZXMsYWVzKG1vbnRoLCBhdmdfcGNfY2FzZXMpKSArIApnZW9tX2JveHBsb3QoYWVzKGNvbG9yID0gRGVuc2l0eSkpIAptbnRobHlfY2FzZV9icGxvdDMgKyBsYWJzKHkgPSAiTWVhbiBQZXIgQ2FwaXRhIERhaWx5IENhc2VzIGJ5IERlbnNpdHkiLHggPSAiTW9udGgiLAogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiQm94IFBsb3Qgb2YgTW9udGhseSBQZXIgQ2FwaXRhIENvdmlkLTE5IENhc2VzIGJ5IERlbnNpdHkiLGZpbGwgPSAiRGVuc2l0eSBbcG9wL21pXjJdIikgIAoKbW50aGx5X2RlYXRoX2JwbG90MyA9IGdncGxvdChzdGF0ZV9tbnRobHlfZGVhdGhzLGFlcyhtb250aCwgYXZnX3BjX2RlYXRocykpICsgCmdlb21fYm94cGxvdChhZXMoY29sb3IgPSBEZW5zaXR5KSkgCm1udGhseV9kZWF0aF9icGxvdDMgKyBsYWJzKHkgPSAiTWVhbiBEYWlseSBQZXIgQ2FwaXRhIERlYXRocyBieSBEZXNuc2l0eSIseCA9ICJNb250aCIsCiAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJCb3ggUGxvdCBvZiBNb250aGx5IFBlciBDYXBpdGEgQ292aWQtMTkgRGVhdGhzIGJ5IERlbnNpdHkiLGZpbGwgPSAiRGVuc2l0eSBbcG9wL21pXjJdIikgCmBgYApgYGB7cn0KcmVnaW9ucyA8LSBzdGF0ZS5yZWdpb24KZGVtb2dyYXBoaWNzIDwtIHN0YXRlLng3NwpkZW1vZ3JhcGhpY3MgPSBkYXRhLmZyYW1lKGRlbW9ncmFwaGljcykKc3RhdGVzX2luZm8gPC0gZGF0YS5mcmFtZSgiTmFtZSIgPSBzdGF0ZXNfdmVjdCwiUmVnaW9uIiA9IHJlZ2lvbnMsIlBvcCI9ZGVtb2dyYXBoaWNzJFBvcHVsYXRpb24pCgpgYGAKCmBgYHtyfQpvcHRpb25zCiNwYXIobWZyb3c9YygyLDEpKQpmb3IgKHZhbCBpbiBzdGF0ZXNfdmVjdCkKewogICMgc3Vic2V0IGJ5IHN0YXRlCiAgZHVtIDwtIHN1YnNldChzdGF0ZV9kYXRhMywgc3RhdGUgPT0gdmFsKQogIAogICAgaWYgKHZhbCA9PSAiQWxhYmFtYSIpewogIHBsb3QoZHVtJGRhdGUsZHVtJHBjX25ld19jYXNlcywibCIsICB4bGFiPSJEYXRlIiwgeWxhYj0iRGx5IFBlciBDYXBpdGEgQ2FzZXMiLHlsaW09YygwLDAuMjVlLTIpLGNleD0zLzQpCiAgcGFyKG5ldyA9IFRSVUUpCiAgcGxvdChkdW0kZGF0ZSxkdW0kcGNfbmV3X2RlYXRocywibCIsICB4bGFiPSIiLCB5bGFiPSIiLGF4ZXMgPSBGQUxTRSxjb2w9cmdiKHJlZCA9IDEsIGdyZWVuID0gMCwgYmx1ZSA9IDAsIGFscGhhID0gMC41KSx5bGltPWMoMCwwLjFlLTMpKQogIGF4aXMoc2lkZT00LCBjb2wuYXhpcyA9ICJkYXJrIHJlZCIsY29sLnRpY2tzID0gImRhcmsgcmVkIiwgeWxpbT1jKDAsMC4xZS0zKSkKICBtdGV4dCgiRGFpbHkgXG4gUGVyIENhcGl0YSBEZWF0aHMiLHNpZGU9NCxsaW5lPTMsIGNvbCA9ICJkYXJrIHJlZCIsY2V4PTIvMykKICB0aXRsZSh2YWwpCiAgfWVsc2V7CiAgICAKICBwbG90KGR1bSRkYXRlLGR1bSRwY19uZXdfY2FzZXMsImwiLCAgeGxhYj0iIiwgeWxhYj0iIix5bGltPWMoMCwwLjI1ZS0yKSkKICBwYXIobmV3ID0gVFJVRSkKICBwbG90KGR1bSRkYXRlLGR1bSRwY19uZXdfZGVhdGhzLCJsIiwgIHhsYWI9IiIsIHlsYWI9IiIsYXhlcyA9IEZBTFNFLGNvbD1yZ2IocmVkID0gMSwgZ3JlZW4gPSAwLCBibHVlID0gMCwgYWxwaGEgPSAwLjUpLCB5bGltPWMoMCwwLjFlLTMpKQogIGF4aXMoc2lkZT00LCBjb2wuYXhpcyA9ICJkYXJrIHJlZCIsY29sLnRpY2tzID0gImRhcmsgcmVkIikKICB0aXRsZSh2YWwpfQp9CmBgYApBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoK